const dayJs = require("dayjs");
const nodemailer = require('nodemailer');
const ping = require('ping')


module.exports = {
  formateDate(date) {
    return dayJs(date).format("DD/MM/YYYY");
  },
  // sendEmail(mailOptions) {
  //   console.log("邮箱设置",this.app.config.qqEmail)
  //   console.log("参数",mailOptions)
  //   const transporter = nodemailer.createTransport(this.app.config.qqEmail);
  //   transporter.sendMail(mailOptions, (err, info) => {
  //       console.log("结果",info,err)
  //     if (!err) {
  //       return { code: 0, msg: "验证码发送成功", info };
  //     } else {
  //       return { code: 1, msg: "验证码发送失败，请稍后重试", error };
  //     }
  //   });
  // },
  sendEmail(mailOptions,code) {
    return new Promise((resolve, reject) => {
        const {redis} = this.ctx.app

        // console.log("邮箱设置", this.app.config.qqEmail);
        console.log("参数mailOptions", mailOptions);
        const transporter = nodemailer.createTransport(this.app.config.qqEmail);
        transporter.sendMail(mailOptions, async(err, info) => {
            console.log("结果", info, err);
            if (!err) {
               // 存入redis  并设置10分钟的过期时间  
              await redis.set(mailOptions.to, code);
              await redis.expire(mailOptions.to, 300);

              // 获取 Redis 键值对
              // const name = await redis.get('name');
              // ctx.body = `Hello, ${name}`;


                resolve({ code: 0, msg: "验证码发送成功" });
               
                

            } else {
                reject({ code: 1, msg: "验证码发送失败，请稍后重试", error: err });
            }
        });
    });
  },

  /**
   *生成*位随机数 默认为6位
   * @param {number} length
   */
  rand(length = 6) {
    let Num = "";
    for (let i = 0; i < length; i++) {
      Num += Math.floor(Math.random() * 10);
    }
    return Num;
  },
  GenerateToken( data)  {
    const { app, ctx } = this;
    // helper.GenerateToken(this, { username, password, timer }) 调用
    // sign 的data 可以是对象
    const token = app.jwt.sign(data, app.config.jwt.secret);
  
    return token;
  },

  
  // 判断服务器的可达性
  isReachable(host) { // 192.168.0.1
    return new Promise((resolve, reject) => {
      ping.sys.probe(host, function(isAlive){
        var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
        console.log("msg",msg);
        resolve(isAlive);
     });
    })
  },

  // 从config中拿到  serverList 判断服务器的可达性  返回requestRecord（redis存储） currentIP 最优目标ip  
  // 后期优化 给每台服务器按性能增加请求权重 ， 排序按照 requesting - 权重  （权重 == 请求数量）
  async loadBalancing(){
    const { app, ctx } = this;
    const { redis } = this.ctx.app


    // 判断服务器的可达  记录请求 先行读取缓存（60s失效）  没有缓存在发起请求
    const serverList = this.config.serverList.tts
    let pingList = await redis.get("pingList")
    pingList = pingList ? JSON.parse(pingList) :  await Promise.all(serverList.map(async item => {
        const flag = await ctx.helper.isReachable(item);
        return flag ? item : null;
    }));
    console.log("@@pingList",pingList)
    // return []
    // 获取当前处理的列表 去空 
    const okServerList = pingList.filter(item => item !== null); // 获取可用的服务器
    if(okServerList.length === 0) return ctx.responseData(null,"无服务器在线响应请求，请联系管理人员",1)  // 处理没有可用服务器的情况
    let requestRecord = await ctx.app.redis.get("requestRecord"); // 获取redis记录的请求
    requestRecord = requestRecord ? JSON.parse(requestRecord) : {}; //  redis 记录值初始化  
    // console.log("okServerList",okServerList)
    
    //缓存ping列表 ，减少服务器压力 
    await redis.set("pingList",JSON.stringify(okServerList))
    await redis.expire("pingList", 60);

    // 对没有存储过的redis服务器 存储数据格式  requestRecord
    okServerList.forEach( item =>{
        requestRecord[item] ? requestRecord[item] : requestRecord[item] = { requesting:0,requested:0 , requestError:0 }
    })
    // 按 requesting 的使用进行 排序 返回 [["192.xx..x",{requeseting:'xx' ,...}],[] ]
    console.log("requestRecord",requestRecord)
    // 因为使用nginx ，egg无法判断请求是否成功返回 ，判断内网服务器请求数量 ，使用暂时使用随机的方式 选中服务器  这个排序无意义
    const sortedArr = Object.entries(requestRecord).sort((a, b) => a[1].requesting - b[1].requesting);
    // const currentIp = sortedArr[0][0];

    // console.log("服务器使用情况",sortedArr)
    // 推荐最终选择请求服务器 
    const currentIp = sortedArr[Math.floor(Math.random()*(sortedArr.length))][0];
    // console.log("current", currentIp)
    this.logger.warn("当前可用组网服务",okServerList , "此次请求分配返回",currentIp)
    return {requestRecord , currentIp }
  }

  
  
};
